package com.wongoing.sys.action;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import com.wongoing.base.PageResult;
import com.wongoing.sys.model.SysRole;
import com.wongoing.sys.model.SysUser;
import com.wongoing.sys.model.ext.SysRoleExt;
import com.wongoing.sys.service.SysRoleService;
import com.wongoing.sys.service.SysUserService;
import com.wongoing.sys.util.Constants;
import com.wongoing.sys.viewmodel.JsonResult;
import com.wongoing.util.LogService;
import com.wongoing.util.ModelAndViewConstants;
import com.wongoing.util.PageUtil;
import com.wongoing.util.Status;

@Controller
@RequestMapping("/sys/sysRoleAction")
public class SysRoleAction extends BaseAction{

	private SysRoleService service;
	private SysUserService sysUserService;
	
	@Autowired
	public void setService(SysRoleService service) {
		this.service = service;
	}
	
	@Autowired
	public void setSysUserService(SysUserService sysUserService) {
		this.sysUserService = sysUserService;
	}
	/**
	 * 功能说明：进入列表显示界面
	 * 修改说明：
	 * @author zhenglibing
	 * @date 2017年10月15日 下午12:55:53
	 * @param pageSize 每页记录数
	 * @param pageCurrent 当前页索引
	 * @param orderField 排序字段
	 * @param orderDirection 排序方向
	 * @param paramName 参数：名称
	 * @param paramDes 参数：描述
	 * @return
	 */
	@RequestMapping(value="/toList")
	public ModelAndView toList(Integer pageSize, Integer pageCurrent, String orderField, String orderDirection, String paramName, String paramDes){
		ModelAndView mv = null;
		try {
			PageResult<SysRoleExt> pageResult = PageUtil.pageSet(this.getClass(), pageSize, pageCurrent, orderField, orderDirection);
			//非通用判断条件
			pageResult.getParam().put("status", "0");
			//模糊查询判断
			List<Boolean> multiFuzzyQuery = new ArrayList<Boolean>();
			if(paramDes!=null && !"".equals(paramDes)){
				pageResult.getParam().put("description", paramDes);
				pageResult.setOrderField("t1.Description");
				pageResult.setOrderDirection("desc");
				pageResult.getExt().put("paramDes",paramDes);
				multiFuzzyQuery.add(true);
			}else{
				multiFuzzyQuery.add(false);
			}
			if(paramName!=null && !"".equals(paramName)){
				pageResult.getParam().put("name", paramName);
				pageResult.setOrderField("t1.Name");
				pageResult.setOrderDirection("desc");
				pageResult.getExt().put("paramName",paramName);
				multiFuzzyQuery.add(true);
			}else{
				multiFuzzyQuery.add(false);
			}
			if(PageUtil.multiFuzzyQuery(multiFuzzyQuery)){
				pageResult.setOrderField("t1.Id");
				pageResult.setOrderDirection("ASC");
			}
			pageResult = this.service.getRoleListPageResult(pageResult);
			mv = new ModelAndView();
			mv.addObject(ModelAndViewConstants.PAGE_RESULT, pageResult);
			mv.setViewName(ModelAndViewConstants.ROLE_MAIN_VIEW);
			LogService.getInstance(this).debug(ModelAndViewConstants.ROLE_MAIN_VIEW);
		}
		catch(Exception ex) {
			LogService.getInstance(this).error("分页获取角色列表失败：" + ex.getMessage(), ex);
			mv = new ModelAndView(ModelAndViewConstants.ERROR_VIEW);
		}
		return mv;
	}
	
	/**
	 * 功能说明：进入添加界面
	 * 修改说明：
	 * @author zhenglibing
	 * @date 2017年10月15日 下午12:57:13
	 * @return
	 */
	@RequestMapping(value="/toAdd")
	public ModelAndView toAdd(){
		ModelAndView mv = null;
		try {
			mv = new ModelAndView();
			mv.addObject(ModelAndViewConstants.OPERATION_KEY, ModelAndViewConstants.OPERATION_VALUE_ADD);
			mv.addObject(ModelAndViewConstants.TITLE_KEY, "添加角色");
			mv.setViewName(ModelAndViewConstants.ROLE_EDIT_VIEW);
			LogService.getInstance(this).debug("进入角色添加页："+ModelAndViewConstants.ROLE_EDIT_VIEW);
		} catch (Exception ex) {
			LogService.getInstance(this).error("角色插入失败：" + ex.getMessage(), ex);
			mv = new ModelAndView(ModelAndViewConstants.ERROR_VIEW);
		}
		return mv;
	}
	
	/**
	 * 功能说明：进入编辑界面
	 * 修改说明：
	 * @author zhenglibing
	 * @date 2017年10月15日 下午12:57:34
	 * @param id
	 * @return
	 */
	@RequestMapping(value="/toEdit")
	public ModelAndView toEdit(Integer id){
		ModelAndView mv = null;
		try {
			SysRole role = this.service.getByPrimaryKey(id);
			mv = new ModelAndView();
			mv.addObject(ModelAndViewConstants.OPERATION_KEY,ModelAndViewConstants.OPERATION_VALUE_EDIT);
			mv.addObject(ModelAndViewConstants.ROLE_MODEL, role);
			mv.addObject(ModelAndViewConstants.TITLE_KEY, "修改角色");
			mv.setViewName(ModelAndViewConstants.ROLE_EDIT_VIEW);
			LogService.getInstance(this).debug("进入角色编辑页："+ModelAndViewConstants.ROLE_EDIT_VIEW);
		} catch (Exception ex) {
			LogService.getInstance(this).error("角色编辑失败：" + ex.getMessage(), ex);
			mv = new ModelAndView(ModelAndViewConstants.ERROR_VIEW);
		}
		return mv;
	}
	
	/**
	 * 功能说明：执行删除操作
	 * 修改说明：
	 * @author Administrator
	 * @date 2017年10月15日 下午12:58:00
	 * @param id
	 * @return
	 */
	@ResponseBody
	@RequestMapping(value = "/doDel")
	public Map<String, Object> toDel(Integer id){
		Map<String, Object> jsonResult = null;
		try {
			String tabid = tabid(ModelAndViewConstants.ROLE_SYS_ID);
			SysRole role = new SysRole();
			role.setId(id);
			role.setStatus(Constants.PERSISTENCE_DELETE_STATUS);
			Integer count = this.service.updateByPrimaryKey(role);
			if(count>0){
				String msg = "角色信息删除成功";
				jsonResult = JsonResult.jsonReturn(Status.OK.getCode(),msg, tabid,false,"","");
				LogService.getInstance(this).debug("删除角色成功，数量："+count);
			}else{
				String msg = "该数据已删除，请核对数据正确性，或重新刷新数据尝试。";
				jsonResult = JsonResult.jsonReturnErr(msg);
				LogService.getInstance(this).debug("删除角色失败，数量："+count);
			}
		} catch (Exception ex) {
			String msg = "删除失败";
			jsonResult = JsonResult.jsonReturnErr(msg);
			LogService.getInstance(this).error("角色删除失败：" + ex.getMessage(), ex);
		}
		return jsonResult;	
	}
	
	/**
	 * 功能说明：执行保存操作
	 * 修改说明：
	 * @author zhenglibing
	 * @date 2017年10月15日 下午12:58:19
	 * @param role
	 * @param op
	 * @return
	 */
	@ResponseBody
	@RequestMapping(value="/doSave")
	public Map<String,Object> doSave(SysRole role ,String op){
		Map<String, Object> jsonResult = null;
		try {
			String tabid = tabid(ModelAndViewConstants.ROLE_SYS_ID);
			Subject subject = SecurityUtils.getSubject();
			String currentName = subject.getPrincipal().toString();
			Date now = new Date();	
			Map<String, Object> param = new HashMap<String, Object>();
			param.put("account", currentName);
			List<SysUser> userlist = this.sysUserService.getByParam(param);
			if(userlist!=null && !userlist.isEmpty()){
				//1.添加op=“add”
				if(ModelAndViewConstants.OPERATION_VALUE_ADD.equals(op) || null==op){
					role.setStatus("0");//状态
					role.setCreateDate(now);//创建人日期
					role.setModifyDate(now);//修改日期
					role.setCreateUser(userlist.get(0).getId());
					role.setModifyUser(userlist.get(0).getId());
					Integer count = this.service.insert(role);
					if(count>0){
						Integer statusCode = 200;
						String msg = "角色添加成功";
						jsonResult = JsonResult.jsonReturn(statusCode.intValue(), msg, tabid);
						LogService.getInstance(this).debug("添加角色成功!");		
					}else{
						String msg = "角色添加失败";
						jsonResult = JsonResult.jsonReturnErr(msg);
						LogService.getInstance(this).debug("添加角色失败!count-->"+count);	
					}	
				}else{
					//2.编辑op=“edit”
					role.setModifyDate(now);//修改日期
					role.setModifyUser(userlist.get(0).getId());
					Integer count = this.service.updateByPrimaryKey(role);
					if(count>0){
						Integer statusCode = 200;
						String msg = "角色信息修改成功";
						jsonResult = JsonResult.jsonReturn(statusCode.intValue(), msg, tabid);
						LogService.getInstance(this).debug("修改角色信息成功!");	
					}else{
						String msg = "角色信息修改失败";
						jsonResult = JsonResult.jsonReturnErr( msg);
						LogService.getInstance(this).debug("修改角色信息失败!count-->"+count);	
					}
				}
			}else{
				String msg = "您当前登录的用户名存在问题，无法保存数据，请重新登录进行尝试！";
				jsonResult = JsonResult.jsonReturnErr(msg);
				LogService.getInstance(this).debug("您当前登录的用户名存在问题，无法保存数据，请重新登录进行尝试!");
			}
		} catch (Exception e) {
			String msg = "保存角色信息失败";
			jsonResult = JsonResult.jsonReturnErr(msg);
			LogService.getInstance(this).debug("保存角色信息失败!"+e.getMessage());
		}
		return jsonResult;	
	}
	/**
	 * 功能说明：执行名称验证操作
	 * 修改说明：
	 * @author zhenglibing
	 * @date 2017年10月15日 下午12:55:22
	 * @param name
	 * @param op
	 * @param original
	 * @return
	 */
	@ResponseBody
	@RequestMapping(value="/doNameValidate")
	public Map<String, Object> doNameValidate(String name,String op,String original){
		Map<String,Object> jsonResult = null;
		try {
			String where = " BINARY Name='"+name+"' and Status='0' ";
			List<SysRole> list = this.service.getByWhere(where);
			if(list!=null){
				int count = list.size();
				switch (count) {
				case 0:
					jsonResult = JsonResult.jsonValidateReturn(true, "验证通过，该角色名可以使用");
					LogService.getInstance(this).debug("角色名验证通过，可使用");
					break;
				case 1:
					if(ModelAndViewConstants.OPERATION_VALUE_EDIT.equals(op)){
						if(name.equals(original)){
							jsonResult = JsonResult.jsonValidateReturn(true, "验证通过，该角色名可以使用");
							LogService.getInstance(this).debug("角色名验证通过，可使用");
						}else{
							jsonResult = JsonResult.jsonValidateReturn(false, "该角色名称已被使用");
							LogService.getInstance(this).debug("角色名称已被使用，不可使用");
						}
					}else{
						jsonResult = JsonResult.jsonValidateReturn(false, "该角色名称已被使用");
						LogService.getInstance(this).debug("角色名称已被使用，不可使用");
					}
					break;
				default:
					jsonResult = JsonResult.jsonValidateReturn(false, "该角色名称已被使用");
					LogService.getInstance(this).debug("角色名称已被使用，不可使用");
					break;
				}
			}else{
				jsonResult = JsonResult.jsonValidateReturn(false, "验证失败");
				LogService.getInstance(this).error("角色名称验证失败");
			}
		} catch (Exception e) {
			jsonResult = JsonResult.jsonValidateReturn(false, "验证失败");
			LogService.getInstance(this).error("角色名称验证失败");
		}
		return jsonResult;
	}
}
